// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package io.flutter.plugin.platform;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import io.flutter.view.AccessibilityBridge;

/**
 * Delegates accessibility events to the currently attached accessibility bridge if one is attached.
 */
class AccessibilityEventsDelegate {
    private AccessibilityBridge accessibilityBridge;

    /**
     * Delegates handling of {@link android.view.ViewParent#requestSendAccessibilityEvent} to the accessibility bridge.
     *
     * This is a no-op if there is no accessibility delegate set.
     *
     * This is used by embedded platform views to propagate accessibility events from their view hierarchy to the
     * accessibility bridge.
     *
     * As the embedded view doesn't have to be the only View in the embedded hierarchy (it can have child views) and the
     * event might have been originated from any view in this hierarchy, this method gets both a reference to the
     * embedded platform view, and a reference to the view from its hierarchy that sent the event.
     *
     * @param embeddedView the embedded platform view for which the event is delegated
     * @param eventOrigin the view in the embedded view's hierarchy that sent the event.
     * @return True if the event was sent.
     */
    public boolean requestSendAccessibilityEvent(@NonNull View embeddedView, @NonNull View eventOrigin, @NonNull AccessibilityEvent event) {
        if (accessibilityBridge == null) {
            return false;
        }
        return accessibilityBridge.externalViewRequestSendAccessibilityEvent(embeddedView, eventOrigin, event);
    }

    /*
     * This setter should only be used directly in PlatformViewsController when attached/detached to an accessibility
     * bridge.
     */
    void setAccessibilityBridge(@Nullable AccessibilityBridge accessibilityBridge) {
        this.accessibilityBridge = accessibilityBridge;
    }
}
